前言
目前IT设备对于大多数企业公司来说是必不可少的基础设施,由于云计算的按需付费,便捷配置计算资源(资源包括网络,服务器,存储,应用软件,服务)的特点很受企业的欢迎,因此大多数企业都从传统的IDC迁移到云平台,或者直接到云平台上搭建自己的业务。然而云计算平台很多家,国外有云计算鼻祖亚马AWS,还有微软的Azure,Google的GCP,国内而言比较有名的,阿里巴巴的Alicloud,腾讯的TencentCloud,华为的HuaweiCloud。
在运维领域中,针对这些云平台的IT资源管理也是重中之重。尤其是最近几逐渐流行的DevOps理念,Infrastructure as Code(基础架构即代码)文化,所以在社区的贡献下,Terraform这个工具应用而生,Terraform是来自HashiCorp家族,因此采用了 HashiCorp 配置语言 (HCL),Terraform的意义在于,通过同一套规则和命令来操作不同的云平台(包括私有云)。详情可参考官方文档https://www.terraform.io。
参考:
https://bbs.huaweicloud.com/blogs/86505eb5eefa11e8bd5a7ca23e93a891
https://www.jianshu.com/p/d0035b7c3801
https://www.linode.com/docs/applications/configuration-management/create-terraform-module/
安装terraform
以下是官方安装教程https://www.terraform.io/intro/getting-started/install.html,下载解压,配置环境变量即可。以下是我的环境
1 | [centos@ip-10-20-6-165 ~]$ uname -r |
编写配置
目录配置
1 | terraform_scripts/ |
模块化脚本(华为云)
network模块
network/variables.tf
1 | variable "vpc_name" { |
network/outputs.tf
1 | output "vpc_id" { |
network/main.tf
1 | #-----VPC |
instance模块
instance/variables.tf
1 | variable "instance_sg" { |
instance/outputs.tf
1 |
instance/main.tf
1 | #-----ECS |
主执行文件
variables.tf
1 | variable "secret_key" { |
terraform.tfvars
1 | secret_key = "string" |
main.tf
1 | #---provider |
AWS基本使用脚本(非模块化)
目录结构
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ ll |
backend.tf
这个文件是定义provider和远程存储terraform.tfstate的s3存储桶,provider是Terraform定制的一套接口,阿里云、AWS、私有云等如果想接入进来被Terraform编排和管理就要实现一套Provider,官网https://www.terraform.io/docs/providers/index.html,我使用的AWS的云平台,所以使用的AWS的provider。
关于terraform.tfstate,我在前言中说过,状态文件是记录当前资源的状态。每次运行terraform apply时,都会把最新的配置和当前状态文件中的内容进行比较后,再做更改。所以这个文件不能乱改,团队协作时可以加个锁,因此手动通过AWS console添加了一个存储桶,然后再加了一个dynamodb_table的锁。
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat backend.tf |
variables.tf
这个文件相当于申明了variable,可以在此加一个默认的值
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat variables.tf |
terraform.tfvars
此文件是在文件申明的变量赋值,赋值可以供当前目录的其他的文件引用
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat terraform.tfvars |
vpc.tf
这个文件就是主文件,用来建立VPC,subnet,gateway,natgateway,路由表,路由表关联等一系列操作。其中有些是Terraform的内部函数,关于内部函数可参考https://www.terraform.io/docs/configuration/interpolation.html
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat vpc.tf |
outputs.tf
当我们创建的资源后,经常需要知道这些资源的ID,因此定义一个output,将我们想要的资源ID显示出来或者输出到文件,从而避免我们在去控制台上查询获取这些信息。Terraform的出参就像是存过的产出,开发人员可以在编排时定义output出参来指定自己关心的内容,该内容会在任务执行的日志中高亮显示,而且在任务执行完毕后我们可以通过terrafomr output var_name的方式查看参数结果。
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat outputs.tf |
bastion.tf
当VPC建立好的时候,我们只需要通过一台有公网IP的跳板机,去访问私网的机器,这个文件就是创建一个跳板机的安全组,能通过IP(1...*/28 )访问跳板机的22,2022端口,80,443,53,123端口流量能出,通过安全组限制网络进出流量。安全起见,我对其中IP加密显示,可以自行更改。更严格的还可以通过VPC配置的Network ACLs去控制。
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat bastion.tf |
common.tf
这个文件是创建了一个共有的安全组给私网地址的机器使用。能接受当前VPC下私网10.0.0.0/8网段的任何流量,流量能从80,443,53,123的端口出。
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ cat common.tf |
AWS key
创建Access key 参考官网https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html
配置Access key 参考官网https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-getting-started.html
1 | [centos@ip-10-20-6-165 ~]$ aws configure --profile rubin-stg |
创建资源
Terrform get & init
执行terraform init命令,就像git init一样,对当前目录做初始化,下载tf中的provider,并为后续的操作准备必要的环境条件
1 | [centos@ip-10-20-6-165 ~]$ cd rubin/terraform/vpc/stg_cn_rubin/ |
Terraform plan
预览执行计划,不是必须,可以预览要创建的资源,终端日志太长,只粘贴一部分
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ terraform plan |
Terraform apply
真正执行编排计划,创建资源的终端日志太长,只粘贴一部分,几分钟后整个资源全被创建完成,最后output把当前资源的ID显示出来了
1 | [centos@ip-10-20-6-165 stg_cn_rubin]$ terraform apply |